package com.cai.config;

import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

// 拦截器 AOP实现
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    // 授权
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // 首页所有人可以访问，功能页只有对应权限的人才能访问 AOP原理
        // 1.authorizeRequests 授权请求
        // 2.antMatchers 匹配请求页面
        // 3.permitAll 全部允许访问
        // 4.hasRole 指定角色访问 （对应的模块权限）
        http.authorizeRequests()
                // 请求授权的规则
                .antMatchers("/").permitAll()
                .antMatchers("/level1/**").hasRole("vip1")
                .antMatchers("/level2/**").hasRole("vip2")
                .antMatchers("/level3/**").hasRole("vip3");
        // 登录功能：没有权限 默认到登录页面 ,指定登录页
        // 拦截login请求
        // 转发到toLogin
        // 指定user pwd参数
        http.formLogin()
                .loginProcessingUrl("/login")
                .loginPage("/toLogin")
                .usernameParameter("user")
                .passwordParameter("pwd");
        // 防止网站攻击 get post 关闭csrf功能
        http.csrf().disable();
        // 退出登录 开启了注销功能
        http.logout().logoutSuccessUrl("/");
        // 记住账号密码 （下次免登录 默认记住两周）,接收前端指定参数记住我
        http.rememberMe().rememberMeParameter("remember");

    }

    // 认证
    // 报错：passwordEncoder 没有加密
    //
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        // inMemoryAuthentication内存认证
        // passwordEncoder设置加密 encode编码
        // 这些数据 实战中从数据库中获取

        // zhang_san 有vip2 vip3权限 可以发送对应的请求，访问对应的网页，
        // 没有vip3权限 不能请求"/level3/**"
        auth.inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder())
                .withUser("zhang_san")
                .password(new BCryptPasswordEncoder().encode("123456"))
                .roles("vip2", "vip3")

                .and()

                .withUser("root")
                .password(new BCryptPasswordEncoder().encode("root"))
                .roles("vip1", "vip2", "vip3")

                .and()

                .withUser("cwj")
                .password(new BCryptPasswordEncoder().encode("cwj"))
                .roles("vip3");
    }
}